import { defineStore } from "pinia";
import { reqLogin, reqUserInfo, reqLogout } from "@/api/user";
import type { loginFormData, loginResponseData, userInfoResponseData } from '@/api/user/type'
import type { UserState } from './types/types'
import { SET_TOKEN, GET_TOKEN, REMOVE_TOKEN } from '@/utils/token'
import { constanRoutes, asyncRoutes, anyRoutes } from "@/router/routes";

import router from "@/router";
// 引入深拷贝
// @ts-ignore
import cloneDeep from 'lodash/cloneDeep'

// 用于过滤当前用户需要展示的一步路由
const filterAsyncRoute = (asyncRoutes:any, routes:any) => {
  // 这只能过滤出符合条件的一级路由 一级路由下的children没有过滤
  return asyncRoutes.filter((item:any) => {
    if(routes.includes(item.name)) {
      //  利用递归过滤二级路由
      if(item.children&& item.children.length >0) {
        // 硅谷333需要展示的路由 过滤完之后 原asyncRoute中的数据会发生变化, item.children会被替换成符合条件的 
        // 下个用户登录 应该用原asyncRoute进行比较 可以用深拷贝解决
        // 过滤出来的结果重新赋值给一级的children 更复杂的多级路由一样
        item.children = filterAsyncRoute(item.children, routes)
      }
      return true
    }
  })
}

export const useUserStore = defineStore('User', {
  state ():UserState {
    return {
      token: GET_TOKEN(),
      menuRoutes: constanRoutes, //仓库存储生成菜单需要的路由数组
      username: '',
      avatar: '',
      // 存储当前用户是否包含某个按钮权限
      buttons: []
    }
  },
  actions: {
    // 用户登录
    async userLogin (data: loginFormData) {
      const res:loginResponseData = await reqLogin(data)
      if(res.code == 200) {
        this.token = (res.data as string)
        // 本地持久化存储
        SET_TOKEN((res.data as string))
        // 返回成功的promise
        return 'ok'
      } else {
        return Promise.reject(new Error(res.message))
      }
    },
    // 获取用户信息
    async userInfo () {
      // 获取用户信息存储在仓库
      const res:userInfoResponseData = await reqUserInfo()
      if(res.code == 200) {
        this.username = res.data.name
        this.avatar = res.data.avatar
        this.buttons = res.data.buttons
        //异步路由界面刷新会白屏 异步路由是动态追加的 可能还没追加完 就直接访问了 可以在守卫解决
        // 计算当前用户需要展示的路由
        const userAsyncRoutes = filterAsyncRoute(cloneDeep(asyncRoutes), res.data.routes)
        // 菜单数据 这里只是menuRoutes中追加了,用于左侧菜单 router中还没加
        this.menuRoutes = [...constanRoutes, ...userAsyncRoutes, ...anyRoutes]
        // console.log(router.getRoutes) // 获取路由器所有路由
        const arr = [...userAsyncRoutes, ...anyRoutes]
        arr.forEach((route:any) => {
          router.addRoute(route)
        })
        return 'ok'
      } else {
        return Promise.reject(new Error(res.message))
      }
    },
    // 退出登录
    async userLogout () {
      const res = await reqLogout()
      if(res.code == 200) {
        this.token = ''
        this.username = ''
        this.avatar = ''
        REMOVE_TOKEN()
        return 'ok'
      } else {
        return Promise.reject(new Error(res.message))
      }
    }
  },
  getters: {

  }
})





